//package com.woniuxy.project115.kaer.tenant.util;
//
//import com.alipay.api.java_websocket.WebSocket;
//import cn.hutool.json.JSONUtil;
//import com.woniuxy.project115.kaer.commons.util.JwtUtil;
//import com.woniuxy.project115.kaer.commons.util.Result;
//import com.woniuxy.project115.kaer.tenant.config.SocketMag;
//import io.jsonwebtoken.Claims;
//import lombok.Data;
//import org.mybatis.logging.Logger;
//import org.mybatis.logging.LoggerFactory;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.socket.*;
//import javax.annotation.Resource;
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author HuH
// * @version 1.0
// * @CreatTime 2025-02-24 01:26
// * @description
// */
//@Data
//public class WebSocketUtil implements WebSocketHandler {
//    private  final Logger LOGGER = LoggerFactory.getLogger(WebSocketUtil.class);
//
//    private StringRedisTemplate stringRedisTemplate;
//
//    private String userName;
//    private WebSocketSession session;
//
//    /** 固定前缀  */
//    private  final String USER_NAME_PREFIX = "user_name_";
//
//
//    // 静态变量，用来记录当前在线连接数
//    private  CopyOnWriteArraySet<WebSocketUtil> webSocketSet = new CopyOnWriteArraySet<>();
//    // 静态变量，用来记录客户端会话
//    private  ConcurrentHashMap<String, WebSocketSession> sessionMap = new ConcurrentHashMap<>();
//    // 静态变量，用来记录未读消息
//    private  ConcurrentHashMap<String, List<String>> unreadMessagesMap = new ConcurrentHashMap<>();
//
//
//
//    // 根据用户 ID 获取当前所有在线用户的 ID
//    public synchronized Set<String> getOnlineUserIds(String userId) {
//        Set<String> onlineUserIds = new HashSet<>();
//
//        // 遍历 sessionMap,获取所有在线用户的 ID
//        for (String key : sessionMap.keySet()) {
//            if (key.startsWith(USER_NAME_PREFIX)) {
//                String accountId = key.substring(USER_NAME_PREFIX.length());
//                onlineUserIds.add(accountId);
//            }
//        }
//
//        onlineUserIds.forEach(o-> System.out.println("当前在线用户的ID为: " + o));
//        return onlineUserIds;
//    }
//
//    // 通过用户 ID 获取跟应id用户连接的用户名
//    public synchronized String getUserNameById(String userId) {
//        // 使用用户 ID 查找 WebSocketSession
//        WebSocketSession userSession = sessionMap.get(USER_NAME_PREFIX + userId);
//
//        if (userSession != null) {
//            // 在这种假设下，我们认为用户会话中或映射关系中存储着用户名
//            // 如果用户名存储在session里或者可以通过其他方式获取，例如一个用户对象
//            WebSocketUtil webSocketUtil = findWebSocketUtilBySession(userSession);
//
//            if (webSocketUtil != null) {
//                return webSocketUtil.getUserName(); // 返回用户名
//            }
//        }
//
//        System.out.println("用户 ID " + userId + " 不在线或会话信息不可用。");
//        return null; // 或抛出自定义异常
//    }
//
//    // 帮助方法，根据会话找到 WebSocketUtil 实例
//    private WebSocketUtil findWebSocketUtilBySession(WebSocketSession session) {
//        for (WebSocketUtil item : webSocketSet) {
//            if (item.getSession().getId().equals(session.getId())) {
//                return item;
//            }
//        }
//        return null;
//    }
//
//    // 私聊：向指定客户端推送消息
//    public synchronized void privateMessage(SocketMag socketMsg) {
//        WebSocketSession receiveUser = sessionMap.get(USER_NAME_PREFIX + socketMsg.getReceiveUser());
//        if (receiveUser != null) {
//            System.out.println(socketMsg.getSendOutUser() + " 向 " + socketMsg.getReceiveUser() + " 发送了一条消息：" + socketMsg.getMsg());
//            try {
//                receiveUser.sendMessage(new TextMessage(socketMsg.getSendOutUser() + "：" + socketMsg.getMsg()));
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        } else {
//            System.out.println(socketMsg.getSendOutUser() + " 私聊的用户 " + socketMsg.getReceiveUser() + " 不在线或者输入的用户名不对");
//            unreadMessagesMap.computeIfAbsent(socketMsg.getReceiveUser(), k -> new ArrayList<>())
//                    .add(socketMsg.getSendOutUser() + ": " + socketMsg.getMsg());
//
//            WebSocketSession sendOutUser = sessionMap.get(USER_NAME_PREFIX + socketMsg.getSendOutUser());
//            if (sendOutUser != null) {
//                try {
//                    sendOutUser.sendMessage(new TextMessage("系统消息：对方不在线，您的消息已保存，等待对方上线。"));
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//    // 向特定用户发送通知
//    public synchronized void sendNotification(String userId, String message) {
//        System.out.println("向id为 " + userId + " 发送通知：" + message);
//        //通过id 找到姓名
////        String userName =
//        WebSocketSession userSession = sessionMap.get(USER_NAME_PREFIX + userName);
//        if (userSession != null && userSession.isOpen()) {
//            try {
//                userSession.sendMessage(new TextMessage("系统通知: " + message));
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        } else {
//            // 用户不在线, 可以选择将消息存储在某个地方, 待用户上线后再推送
//            System.out.println("用户 " + " 不在线, 无法立即发送通知消息。");
//            // 将消息存储在某个地方, 例如 Redis 或数据库
//            stringRedisTemplate.opsForValue().set(RedisKey.MERCHANT_APPLY_NOTICE(Integer.valueOf(userId)), message, 3, TimeUnit.DAYS);
//        }
//    }
//
//    @Override
//    public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
//        String uri = webSocketSession.getUri().toString();
//        String token = uri.substring(uri.lastIndexOf("/") + 1);
//        System.out.println("提取到的 token: " + token);
//        Integer userIdByToken = JwtUtil.getUserId(token);
//        String userNameByToken = JwtUtil.getUserName(token);
//        this.userName = userNameByToken;
//        this.session = webSocketSession;
//        sessionMap.put(USER_NAME_PREFIX + userName, session);
//        webSocketSet.add(this);
//        //检查是否有未读消息
//        if (stringRedisTemplate.hasKey(RedisKey.MERCHANT_APPLY_NOTICE(userIdByToken))) {
//            //把消息取出来
//            String message = stringRedisTemplate.opsForValue().get(RedisKey.MERCHANT_APPLY_NOTICE(userIdByToken));
//            //发送消息
//            sendNotification(userIdByToken, message);
//            //移除消息
//            stringRedisTemplate.delete(RedisKey.MERCHANT_APPLY_NOTICE(userIdByToken));
//        }
//
//        String tips = userName + " 加入聊天室。当前聊天室人数为" + webSocketSet.size();
//        System.out.println(tips);
//        // 向当前用户发送通知
//        publicMessage(userName, tips, true);
//    }
//
//    // 处理消息 处理
//    @Override
//    public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
//        if (webSocketMessage instanceof TextMessage) {
//            TextMessage textMessage = (TextMessage) webSocketMessage;
//            String msg = textMessage.getPayload();
//
//            if (JSONUtil.isJsonObj(msg)) {
//                SocketMag socketMsg = JSONUtil.toBean(msg, SocketMag.class);
//
//                if (socketMsg.getType() == 1) {
//                    privateMessage(socketMsg);
//                } else {
//                    publicMessage(socketMsg.getSendOutUser(), socketMsg.getSendOutUser() + ": " + socketMsg.getMsg(), false);
//                }
//            }
//        } else {
//            throw new IllegalArgumentException("只接受文本消息");
//        }
//    }
//
//    @Override
//    public void handleTransportError(WebSocketSession webSocketSession, Throwable error) throws Exception {
//        System.out.println("userName为：" + userName + "，发生错误：" + error.getMessage());
//        error.printStackTrace();
//    }
//
//    @Override
//    public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
//        if (sessionMap.containsKey(USER_NAME_PREFIX + userName)) {
//            sessionMap.remove(USER_NAME_PREFIX + userName);
//            webSocketSet.remove(this);
//        }
//        System.out.println("用户 " + userName + " 已关闭连接，关闭状态：" + closeStatus);
//        if (closeStatus.getCode() == CloseStatus.NORMAL.getCode()) {
//            System.out.println("连接正常关闭。");
//        } else {
//            System.out.println("连接异常关闭，状态码：" + closeStatus.getCode());
//        }
//        String tips = userName + " 退出聊天室。当前聊天室人数为 " + webSocketSet.size();
//        System.out.println(tips);
//        publicMessage(userName, tips, true);
//    }
//
//    @Override
//    public boolean supportsPartialMessages() {
//        return false;
//    }
//
//    // 群聊：公开聊天记录
//    public synchronized  void publicMessage(String userName, String message, boolean flag) {
//        for (WebSocketUtil item : webSocketSet) {
//            WebSocketSession session = item.session;
//            if (flag) {
//                try {
//                    session.sendMessage(new TextMessage(message));
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            } else {
//                WebSocketSession currentUser = sessionMap.get(USER_NAME_PREFIX + userName);
//                if (!session.getId().equals(currentUser.getId())) {
//                    try {
//                        session.sendMessage(new TextMessage(message));
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                }
//            }
//        }
//        System.out.println("公共频道接收了一条消息：" + message);
//    }
//}
